#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <pthread.h>
#include <errno.h>

void *tfun12(void *args)
{
	char buf[100] = {0};
	int sockfd = (int)args;
	printf("son thread...tfun1.... pid = %d ...  %lu-sockfd--%d \n", getpid(), pthread_self(), sockfd);
	while (1)
	{
		memset(buf, 0, sizeof(buf));
		int len = read(sockfd, buf, sizeof(buf));
		if (len == -1)
		{
			perror("read error ");
			exit(1);
		}
		else if (len == 0)
		{
			printf("服务端关闭了连接\n");
			break;
		}
		else
		{
			// 继续读
			printf("读到了: %s", buf);
		}
	}
	//  sleep(1);
	return NULL;
}

// gcc clint.c -o   client.o
// gcc server.c -o  server.o
#define SERADDR "192.168.105.10" // 服务器开放给我们的IP地址和端口号
#define SERPORT 9003

char sendbuf[100] = {0};

int main(int argc, const char *argv[])
{

	// 第1步：先socket打开文件描述符
	int sockfd = -1, ret = -1;
	struct sockaddr_in seraddr = {0};
	struct sockaddr_in cliaddr = {0};
	pthread_t tid;

	if (argc < 2)
	{
		perror("  ./a.out port no  \n");
		exit(1);
	}

	int port = atoi(argv[1]);

	// 第1步：socket  打开客户端文件描述符
	sockfd = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == sockfd)
	{
		perror("socket  fail");
		return -1;
	}

	int on = 1;
	setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); // 设置网络属性重用地址

	printf("socketfd = %d.\n", sockfd);

	// 第2步：connect链接服务器
	seraddr.sin_family = AF_INET;				  // 设置地址族为IPv4
	seraddr.sin_port = htons(port);				  // 设置地址的端口号信息
	seraddr.sin_addr.s_addr = inet_addr(SERADDR); // 　设置IP地址， 字符串转化为10进制  unsign int

	// 2种方法， IP 转化为网络字节序
	//	ret = inet_pton(AF_INET, SERADDR, &seraddr.sin_addr.s_addr);

	ret = connect(sockfd, (const struct sockaddr *)&seraddr, sizeof(seraddr));
	if (ret < 0)
	{
		perror("connect fail");
		return -1;
	}
	printf("connect result, ret = %d.\n", ret);

	// int ret= pthread_create(&tid, NULL, tfun12, (void*) 1999);  // 返回线程id
	ret = pthread_create(&tid, NULL, tfun12, (void *)sockfd); // 返回线程id
	if (ret != 0)
	{
		fprintf(stderr, "pthread_create fail--%s \n", strerror(ret));
		exit(1);
	}
	ret = pthread_detach(tid); // 设置线pthread_join程分离,0表示成功

	// 分离开以后，线程执行完毕会被自动回收tid,没有了，后面pthread_join 来回收会出错
	if (ret != 0)
	{
		fprintf(stderr, "pthread_detach fail--%s \n", strerror(ret));
		exit(1);
	}

	char buf[100] = {0};

	while (1)
	{

		// 等待接受
		memset(buf, 0, sizeof(buf));
		printf("请输入要发送的字符串:\n");
		// fgets输入enter 结束buf末尾带有\n
		fgets(buf, sizeof(buf), stdin);
		write(sockfd, buf, strlen(buf));
	}

	close(sockfd);

	// ret = recv(sockfd, sendbuf, sizeof(sendbuf), 0);
	// printf("成功接收了%d个字节\n", ret);
	// printf("client发送过来的内容是：%s\n", sendbuf);

	return 0;
}